const arrayProto = Array.prototype

export const arrayMethod = Object.create(arrayProto)
const methodsToPatch = [
  'push',
  'pop',
  'shift',
  'unshift',
  'splice',
  'sort',
  'reverse'
]

methodsToPatch.forEach(method => {
  arrayMethod[method] = function(...arg) {
    const result = arrayProto[method].apply(this, arg)

    const ob = this.__ob__; //获取到数据的Observe实例
    let insert
    switch (method) {
      case 'push':
      case 'unshift':
        insert = arg
        break
      case 'splice':
        insert = arg.slice(2)
      default:
        break;
    }
    if(insert) {
      // 如果有新增的元素 inserted是一个数组 调用Observer实例的observeArray对数组每一项进行观测
      ob.observeArray(insert) //这就是为什么之前给数据添加__ob__属性的原因之一
      console.log('有新增元素', insert);
    }
    ob.dep.notify()
    return result
  }
})
